﻿///////////////////////////////////////////////////////////////////////////
//  Copyright(c) 2023, GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007
//
/// @file    geobj.h
/// @brief   game engine object
/// @version 0.1
/// @history 修改历史
/// @warning 没有警告
///////////////////////////////////////////////////////////////////////////
#ifndef __GEOBJ_H__
#define __GEOBJ_H__


#include "klb_type.h"
#include "klbutil/klb_map.h"
#include "core/render.h"


#if defined(__cplusplus)
extern "C" {
#endif

typedef struct geobj_t_ geobj_t;


/// @brief 创建
typedef geobj_t* (*geobj_create_cb)();


/// @brief 销毁
typedef void (*geobj_destroy_cb)(geobj_t* p_obj);


/// @brief 向object设置数据
/// @param [in] *p_obj      object
/// @param [in] *p_map      map数据集合
/// @return int 0.成功; 非0.失败(错误码)
typedef int (*geobj_on_set_cb)(geobj_t* p_obj, const klb_map_t* p_map);


/// @brief 向object获取数据
/// @param [in] *p_obj      object
/// @param [in] *p_map      map数据集合
/// @return klb_map_t* map数据集合
typedef klb_map_t* (*geobj_on_get_cb)(geobj_t* p_obj, const klb_map_t* p_map);


/// @brief 绘制
typedef int (*geobj_on_draw_cb)(geobj_t* p_obj, render_t* p_render);


/// @struct geobj_vtable_t
/// @brief  game engine object vtable
typedef struct geobj_vtable_t_
{
    geobj_destroy_cb    cb_destroy;     ///< 销毁

    geobj_on_set_cb     cb_set;         ///< 设置数据
    geobj_on_get_cb     cb_get;         ///< 获取数据

    geobj_on_draw_cb    cb_draw;        ///< 绘制
}geobj_vtable_t;


/// @struct geobj_t
/// @brief  game engine object 基础节点对象
typedef struct geobj_t_
{
    geobj_vtable_t  vtable;     ///< 函数表

    // 用于记录树形结构
    geobj_t*        p_parent;   ///< 父节点, 树形结构
    geobj_t*        p_child;    ///< 子节点

    geobj_t*        p_prev;     ///< 前一个兄弟节点
    geobj_t*        p_next;     ///< 后一个兄弟节点

    // 用户数据
    void*           p_udata;    ///< public user data, [公共用户数据]

    // 组件数据
    char            extra[];    ///< 私有数据域
}geobj_t;


///< 销毁
void geobj_destroy(geobj_t* p_obj);


#ifdef __cplusplus
}
#endif


#endif // __GEOBJ_H__
//end
